module.exports = [
  {
    text: 'html&css',
    items: [
      {text: '如何设计实现无缝轮播', link: '/html/Carousel/'},
      {text: '实现一个 Dialog 类）', link: '/html/dialog/'},
      {text: 'BFC、IFC、GFC 和 FFC', link: '/html/BFC/'},
      {text: '文本溢出', link: '/html/overflow/'},
    ]
  }, {
    text: 'javascript',
    items: [
      {text: 'js的面向对象编程', link: '/js/js的面向对象编程/'},
      {text: 'ES5/ES6 的继承除了写法以外还有什么区别？', link: '/js/ES5/ES6 的继承除了写法以外还有什么区别？/'},
      {text: '用深度优先思想和广度优先思想实现一个拷贝函数？', link: '/js/用深度优先思想和广度优先思想实现一个拷贝函数？/'},
      {text: '如何实现一个 new', link: '/js/如何实现一个 new/'},
      {text: 'js原型和原型链以及应用', link: '/js/js原型和原型链以及应用/'},
      {text: 'js作用域提升和闭包', link: '/js/js作用域提升和闭包/'},
      {text: 'es6中模拟map源码', link: '/js/es6中模拟map源码/'},
      {text: '模拟call源码', link: '/js/模拟call源码/'},
      {text: '模拟bind源码', link: '/js/模拟bind源码/'},
      {text: '模拟apply源码', link: '/js/模拟apply源码/'},
      {text: 'generator', link: '/js/generator/'},
      {text: 'promise 以及promise的应用 异步加载文件', link: '/js/promise/'},
      {text: '设计并实现 Promise.race()', link: '/js/设计并实现 Promise.race()/'},
      {text: '模拟实现一个 Promise.finally', link: '/js/模拟实现一个 Promise.finally/'},
      {text: 'async await 以及优雅的错误处理', link: '/js/async await 以及优雅的错误处理/'},
      {text: 'Async/Await 如何通过同步的方式实现异步', link: '/js/Async/Await 如何通过同步的方式实现异步/'},
      {text: 'co模块的封装', link: '/js/co模块的封装/'},
      {text: '柯理化函数', link: '/js/柯理化函数/'},
      {text: 'Object.defineProperty缺陷以及proxy', link: '/js/Object.defineProperty缺陷以及proxy/'},
      {text: 'es7中装饰器', link: '/js/es7中装饰器/'},
      {text: '数组去重的八种姿势', link: '/js/数组去重的八种姿势/'},
      {text: 'set、map、weakSet、weakMap区别', link: '/js/set、map、weakSet、weakMap区别/'},
      {text: 'es6转换es5的实现思路', link: '/js/es6转换es5的实现思路/'},
      {text: 'for循环和forEach性能研究', link: '/js/for循环和forEach性能研究/'},
      {text: '浏览器和 Node 事件循环的区别', link: '/js/浏览器和 Node 事件循环的区别/'},
      {text: '内存泄漏 OOM 垃圾回收机制', link: '/js/内存泄漏 OOM 垃圾回收机制/'},
    ]
  },
  {
    text: 'vue',
    items: [
      {text: 'vue混入', link: '/vue/vue混入/'},
      {text: '封装一个全局模态框', link: '/vue/封装一个全局模态框/'},
      {text: 'Vue 的插件机制', link: '/vue/Vue 的插件机制/'},
      {text: 'Vue 的双向数据绑定，Model 如何改变 View，View 又是如何改变 Model 的', link: '/vue/Vue 的双向数据绑定，Model 如何改变 View，View 又是如何改变 Model 的/'},
      {text: 'Vue 的父组件和子组件生命周期钩子执行顺序是什么', link: '/vue/Vue 的父组件和子组件生命周期钩子执行顺序是什么/'},
      {text: 'Virtual DOM 真的比操作原生 DOM 快吗？谈谈你的想法。', link: '/vue/Virtual DOM 真的比操作原生 DOM 快吗？谈谈你的想法。/'},
      {text: '虚拟dom', link: '/vue/虚拟dom/'},
      {text: '写 React / Vue 项目时为什么要在列表组件中写 key，其作用是什么？', link: '/vue/写 React / Vue 项目时为什么要在列表组件中写 key，其作用是什么？/'},
    ]
  }, {
    text: 'react',
    items: [
      {text: 'redux 为什么要把 reducer 设计成纯函数', link: '/react/redux 为什么要把 reducer 设计成纯函数/'},
      {text: 'react-router和 a 标签有什么区别', link: '/react/react-router和 a 标签有什么区别/'},
      {text: '为什么 Vuex 的 mutation 和 Redux 的 reducer 中不能做异步操作？', link: '/react/为什么 Vuex 的 mutation 和 Redux 的 reducer 中不能做异步操作？/'},
      {text: 'hooks', link: '/react/hooks/'},
    ]
  },{
    text: 'node',
    items: [
     {text: 'npm 模块安装机制，为什么输入 npm install 就可以自动安装对应的模块？', link: '/node/npm 模块安装机制，为什么输入 npm install 就可以自动安装对应的模块？/'},
     {text: 'node中并发和多线程的理解', link: '/node/node中并发和多线程的理解/'},
     {text: '浏览器和 Node 事件循环的区别', link: '/node/浏览器和 Node 事件循环的区别/'},
    ]
  },{
    text: '网络编程',
    items: [
     {text: 'http协议 http1.0、1.1、2.0 协议的区别？', link: '/http/http协议 http1.0、1.1、2.0 协议的区别？/'},
     {text: 'Http 状态码 301 和 302 的应用场景分别是什么', link: '/http/Http 状态码 301 和 302 的应用场景分别是什么/'},
     {text: '永久性重定向（301）和临时性重定向（302）对 SEO 有什么影响', link: '/http/永久性重定向（301）和临时性重定向（302）对 SEO 有什么影响/'},
     {text: 'http缓存', link: '/http/http缓存/'},
     {text: '介绍下前端加密的常见场景和方法', link: '/http/介绍下前端加密的常见场景和方法/'},
     {text: 'HTTPS 中间人攻击', link: '/http/HTTPS 中间人攻击/'},
     {text: '接口如何防刷', link: '/http/接口如何防刷/'},
     {text: '浏览器缓存读取规则', link: '/http/浏览器缓存读取规则/'},
     {text: 'websocket', link: '/http/websocket/'},
     {text: 'TCP三次握手和四次挥手的理解', link: '/http/TCP三次握手和四次挥手的理解/'},
     {text: 'cookie 和 token 都存放在 header 中，为什么不会劫持 token？', link: '/http/cookie 和 token 都存放在 header 中，为什么不会劫持 token？/'},
     {text: '如何实现 token 加密', link: '/http/如何实现 token 加密/'},
     {text: 'http2的多路复用', link: '/http/http2的多路复用/'},
    ]
  },{
    text: '优化',
    items: [
     {text: '重绘和回流', link: '/optimization/重绘和回流/'},
     {text: '防抖和节流  input 搜索如何防抖，如何处理中文输入', link: '/optimization/防抖和节流  input 搜索如何防抖，如何处理中文输入/'},
     {text: 'webpack打包vue速度太慢怎么解决', link: '/optimization/webpack打包vue速度太慢怎么解决/'},
     {text: '如何优化首页的加载速度？首页白屏是什么问题引起的？如何解决呢', link: '/optimization/如何优化首页的加载速度？首页白屏是什么问题引起的？如何解决呢/'},
     {text: 'vue 渲染大量数据时应该怎么优化？', link: '/optimization/vue 渲染大量数据时应该怎么优化？/'},
     {text: 'webpack 热更新原理，是如何做到在不刷新浏览器的前提下更新页面的', link: '/optimization/webpack 热更新原理，是如何做到在不刷新浏览器的前提下更新页面的/'},

    ]
  },{
    text: '工程化',
    items: [
     {text: '文档工具', link: '/engineering/文档工具/'},
     {text: 'git的workflow', link: '/engineering/git的workflow/'},
     {text: '接口测试工具', link: '/engineering/接口测试工具/'},
     {text: '敏捷开发工具', link: '/engineering/敏捷开发工具/'},
     {text: '线上bug的解决姿势', link: '/engineering/线上bug的解决姿势/'},
     {text: 'ts的环境搭建', link: '/engineering/ts的环境搭建/'},
     {text: 'Nginx', link: '/engineering/Nginx/'},

    ]
  },{
    text: '多端开发',
    items: [
     {text: 'andorid和js的交互', link: '/engineering/andorid和js的交互/'},
     {text: 'flutter', link: '/engineering/flutter/'},
     {text: 'react-native', link: '/engineering/react-native/'},
    ]
  },{
    text: '面试题',
    items: [
     {text: '实现模糊搜索结果的关键词高亮显示', link: '/interview/实现模糊搜索结果的关键词高亮显示/'},
     {text: '实现 convert 方法，把原始 list 转换成树形结构，要求尽可能降低时间复杂度', link: '/interview/实现 convert 方法，把原始 list 转换成树形结构，要求尽可能降低时间复杂度/'},
     {text: '已知数据格式，实现一个函数 fn 找出链条中所有的父级 id', link: '/interview/已知数据格式，实现一个函数 fn 找出链条中所有的父级 id/'},
     {text: '移动端 Retina 屏 1px 像素问题', link: '/interview/移动端 Retina 屏 1px 像素问题/'},
     {text: '算法题之移动零', link: '/interview/算法题之移动零/'},
     {text: '模拟实现一个深拷贝，并考虑对象相互引用以及 Symbol 拷贝的情况', link: '/interview/模拟实现一个深拷贝，并考虑对象相互引用以及 Symbol 拷贝的情况/'},
     {text: '为什么通常在发送数据埋点请求的时候使用的是 1x1 像素的透明 gif 图片？', link: '/interview/为什么通常在发送数据埋点请求的时候使用的是 1x1 像素的透明 gif 图片？/'},
     {text: '算法题「旋转数组」', link: '/interview/算法题「旋转数组」/'},
     {text: '两个数组合并成一个数组', link: '/interview/两个数组合并成一个数组/'},
     {text: 'a.b.c.d 和 a["b"]["c"]["d"]，哪个性能更高？', link: '/interview/a.b.c.d` 和 a["b"]["c"]["d"]，哪个性能更高？/'},
     {text: '实现一个 sleep 函数', link: '/interview/实现一个 sleep 函数/'},
     {text: '如何把一个字符串的大小写取反（大写变小写小写变大写），例如 "AbC" 变成 "aBc" 。', link: '/interview/如何把一个字符串的大小写取反（大写变小写小写变大写），例如 "AbC" 变成 "aBc" 。/'},
    ]
  },
];
//      {text: '', link: '/react//'},
